我們已經將NFT的合約大致上都部署好了,不過,如果今天我們想要限制錢包購買次數怎麼辦?今天我們就來討論怎麼去增加限制,讓一個人只能mint一個NFT,話不多說,開始實作!
我們先把昨天完成的程式碼叫出來,然後打開Remix,詳情請見Day 28。大致上程式碼都差不多,不過我們者邊需要增加一項限制
,也就是一個人只能mint一個NFT
。
uint256 MAX_SUPPLY = 10;
uint256 MAX_PER_WALLET = 1;
string baseURI = "ipfs://QmXRDUWjxtbBPjoDTRVayEFx6N41YgJFKtZy2GBzpkz3RQ/";
在設定資料的時候多設定一項,一個錢包的最大mint限制。
uint256 tokenId = _tokenIdCounter.current();
require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
require (balanceOf(msg.sender) < MAX_PER_WALLET, " One 'I'mma Man NFT' per ppl");
昨天有說到msg.sender
是一個可以偵測使用者錢包的一個功能,因此,需要設定一個條件,也就是需要該使用者錢包裡的NFT需要小於一個錢包的最大供給量,否則就會跳出失敗訊息,一個人只能mint一個NFT。
先編譯看程式碼有沒有問題
再將合約上鏈
https://ithelp.ithome.com.tw/upload/images/20221007/20152558nLVmNAAl9z.png
我們再點選
Safe Mint
連接錢包後等待成功
再點選一次SafeMint
如果你的電腦有跳出失敗訊息,就代表你成功了!因為失敗為成功之母
當確定在測試鏈的功能都沒問題後,我們就可以把合約推送至以太鏈主網,也就是正式鏈上了
需要注意的就是要把之前狐狸錢包的測試鏈改成以太鏈主網,deploy時會顯示下面告示
大致上內容就是可以調整max gwei就可以在你想要的gas時進行上鏈。
之後只需要將你的合約驗證到以太鏈上就完成了。
怎麼驗證合約點我
下面是我驗證以太坊的網址,有興趣的也可以在以太鏈mint我的I'mma Man NFT
https://etherscan.io/address/0xfa21b2d4a50517b792e026c336205ac838c0524e#writeContract
先打開
Etherscan 連結
https://etherscan.io/address/0xfa21b2d4a50517b792e026c336205ac838c0524e#writeContract
連接錢包
點選SafeMint
點選Write就可以執行了!
今天的優化也完成了,大致上的成品就長這個樣子,不過NFT不只能是圖片,還可以是音樂,甚至有些NFT可以跟我們進行互動,現在很多項目也是使用盲盒機制,這些都是大家之後可以去更深入了解的。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyToken is ERC721, ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
uint256 MAX_SUPPLY = 10;
string baseURI = "ipfs://QmXRDUWjxtbBPjoDTRVayEFx6N41YgJFKtZy2GBzpkz3RQ/";
string public baseExtension = ".json";
constructor() ERC721("I'mma Man NFT", "IMMN") {}
function safeMint() public {
uint256 tokenId = _tokenIdCounter.current();
require (tokenId < MAX_SUPPLY, "All NFT have been minted.");
string memory uri = string(abi.encodePacked(baseURI, Strings.toString(tokenId), baseExtension));
_tokenIdCounter.increment();
_safeMint(msg.sender, tokenId);
_setTokenURI(tokenId, uri);
}
// The following functions are overrides required by Solidity.
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
}